﻿using FlyingCircusWebIS.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FlyingCircusWebIS.Models
{
    public class ModeloAeronaveService : IModeloAeronaveService
    {
        private IAeronaveDAO aeronaveDAO;
        private IModeloAeronaveDAO modeloAeronaveDAO;

        public ModeloAeronaveService()
        {
            modeloAeronaveDAO = new ModeloAeronaveDAO();
            aeronaveDAO = new AeronaveDAO();
        }

        public List<ValidationResult> ValidarEntidade(ModeloAeronave entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool edicao = false;
            if (entidade.IdModeloAeronave!= 0)
                edicao = true;

            if (edicao)
            {
                List<ValidationResult> errosAtualizar = ValidaAtualizar(entidade);
                if (errosAtualizar != null)
                    erros.AddRange(errosAtualizar);
            }
            else
            {
                List<ValidationResult> errosAdicionar = ValidaAdicionar(entidade);
                if (errosAdicionar != null)
                    erros.AddRange(errosAdicionar);
            }

            return erros;
        }

        public List<ValidationResult> ValidaAdicionar(ModeloAeronave entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existePrefixo = modeloAeronaveDAO.Listar().Any(e => e.Prefixo.Equals(entidade.Prefixo, StringComparison.InvariantCultureIgnoreCase));
            if (existePrefixo)
                erros.Add(new ValidationResult("PrefixoExistente", "Já existe um registro com o nome informado."));

            return erros;
        }

        public List<ValidationResult> ValidaAtualizar(ModeloAeronave entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existePrefixo = modeloAeronaveDAO.Listar().Any(e => e.Prefixo.Equals(entidade.Prefixo, StringComparison.InvariantCultureIgnoreCase)
                                                    && e.IdModeloAeronave != entidade.IdModeloAeronave);
            if (existePrefixo)
                erros.Add(new ValidationResult("PrefixoExistente", "Já existe um registro com o nome informado."));


            return erros;
        }

        public void Adicionar(ModeloAeronave entidade)
        {
            modeloAeronaveDAO.Adicionar(entidade);
        }

        public void Atualizar(ModeloAeronave entidade)
        {
            modeloAeronaveDAO.Atualizar(entidade);
        }

        public ModeloAeronave BuscarPorId(int id)
        {
            return modeloAeronaveDAO.BuscarPorId(id);
        }

        public List<ModeloAeronave> Listar()
        {
            return modeloAeronaveDAO.Listar();
        }

        public List<ValidationResult> ValidaRemoverPorId(int id)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existe = modeloAeronaveDAO.Listar().Any(e => e.IdModeloAeronave == id);
            if (!existe)
                erros.Add(new ValidationResult("NaoExiste", "O registro solicitado não existe."));


            bool temDependencia = aeronaveDAO.Listar().Any(e => e.IdModeloAeronave == id);
            if (temDependencia)
                erros.Add(new ValidationResult("Dependencia", "O registro dependência em outro contexto."));

            return erros;
        }

        public void RemoverPorId(int id)
        {
            modeloAeronaveDAO.RemoverPorId(id);
        }

        private List<SelectListItem> ConverterRegistrosModeloAeronaveParaItens(List<ModeloAeronave> modeloAeronaves)
        {
            List<SelectListItem> itens = new List<SelectListItem>();
            itens.Add(new SelectListItem { Text = "<Nenhum>", Value = "" });
            foreach (var modeloAeronave in modeloAeronaves)
            {
                itens.Add(new SelectListItem() { Text = modeloAeronave.Prefixo, Value = modeloAeronave.IdModeloAeronave.ToString() });
            }
            return itens;
        }
    }
}